//经典面试题！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！
package Thread;
//懒汉的方式实现单例模式
//线程不安全，它在多线程环境下可能会创建多个实例
class SingletonLazy{
    //这个引用指向唯一实例，这个引用先初始化为null，而不是立即创建实例
private volatile static SingletonLazy instance = null;//针对这个变量的读写操作就不能重排序了
private static Object locker;
//第一次if判定是否要加锁，第二次if判定是否要创建对象
    //双重校验锁
    public static  SingletonLazy getInstance(){//饿汉模式是在类加载的时候就创建实例了，懒汉则会晚很多，且如果程序用不到这个方法就会省下了
        //加锁效率不高，且容易导致阻塞，所以再加一个判断提高效率
        if(instance ==null) {//判断是否为空，为空再加锁
            //不为空，说明是后续的调用就无需加锁了
            synchronized (locker) {
                if (instance == null) {//如果首次调用就创建实例
                    instance = new SingletonLazy();
                }
            }
        }
        //不是则返回之前创建的引用
        return instance;
    }
    private SingletonLazy(){

    }
}
public class ThreadDemo27 {
    public static void main(String[] args) {
            SingletonLazy s1 = SingletonLazy.getInstance();
            SingletonLazy s2 = SingletonLazy.getInstance();
        System.out.println(s1==s2);
    }
}
